package day23.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * sortStudents类用于演示学生对象的排序功能
 * 包含两种排序方式：自然排序(实现Comparable接口)和比较器排序(实现Comparator接口)
 */
public class sortStudents {
    /**
     * 程序入口点，演示学生对象的不同排序方式
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 创建学生列表并添加测试数据
        List<Student> students = new ArrayList<>();
        students.add(new Student("AA", 20, 85.5));
        students.add(new Student("BB", 19, 92.0));
        students.add(new Student("CC", 21, 78.0));
        students.add(new Student("Cc", 22, 60.0));
        students.add(new Student("DD", 20, 88.5));
        students.add(new Student("EE", 19, 95.0));
        students.add(new Student("tom", 18, 70.0)); 

        // 输出原始学生列表
        System.out.println("原始学生列表:");
        students.forEach(System.out::println);

        // 使用自然排序(基于Student类实现的Comparable接口)
        System.out.println("\n使用自然排序后:");
        Collections.sort(students);
        students.forEach(System.out::println);

        // 清空列表并重新添加相同的数据
        students.clear();
        students.add(new Student("AA", 20, 85.5));
        students.add(new Student("BB", 19, 92.0));
        students.add(new Student("CC", 21, 78.0));
        students.add(new Student("Cc", 22, 60.0));
        students.add(new Student("DD", 20, 88.5));
        students.add(new Student("EE", 19, 95.0));
        students.add(new Student("tom", 18, 70.0));

        // 使用比较器排序
        //1.创建对象
        //2.重写方法
        //3.传参
        System.out.println("\n使用比较器排序后:");
        Collections.sort(students, new StudentComparator());
        students.forEach(System.out::println);
    }

    /**
     * StudentComparator是Student类的比较器实现
     * 提供与Student类中compareTo方法相同的排序规则
     * 用于演示如何使用外部比较器进行排序
     */
    static class StudentComparator implements Comparator<Student> {
        /**
         * 实现Comparator接口的compare方法，定义学生对象的排序规则
         * @param s1 第一个学生对象
         * @param s2 第二个学生对象
         * @return 比较结果：负数表示s1排在前面，0表示相等，正数表示s1排在后面
         */
        @Override
        public int compare(Student s1, Student s2) {
            // tom学生始终排在第一位
            if (s1.getName().equals("tom")) {
                return -1;
            }
            if (s2.getName().equals("tom")) {
                return 1;
            }

            // 按姓名降序排列
            int nameCompare = s2.getName().compareTo(s1.getName());
            if (nameCompare != 0) {
                return nameCompare;
            }

            // 按年龄升序排列
            int ageCompare = Integer.compare(s1.getAge(), s2.getAge());
            if (ageCompare != 0) {
                return ageCompare;
            }

            // 按成绩降序排列
            return Double.compare(s2.getScore(), s1.getScore());
        }
    }
}